Spring ORM এবং Native SQL Queries

Java Technologies - স্প্রিং ওআরএম (Spring ORM)
116
116

স্প্রিং ওআরএম (Spring ORM) পরিচিতি

স্প্রিং ওআরএম (Spring Object-Relational Mapping) জাভা অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে সংযোগ তৈরি করতে ব্যবহার করা হয়। এটি JPA (Java Persistence API) এবং Hibernate এর মতো ORM টুলের সাথে কাজ করতে পারে। তবে, জটিল বা বিশেষ ক্ষেত্রে ডেটাবেস কোয়েরি করার জন্য Native SQL Queries ব্যবহার করতে হয়।


Native SQL Queries কী?

Native SQL Queries ডেটাবেস-নির্দিষ্ট SQL কমান্ড ব্যবহার করে ডেটা ফেচ বা ম্যানিপুলেট করার একটি পদ্ধতি। Hibernate বা JPA এর মাধ্যমে Native SQL ব্যবহার করা সম্ভব, যা ডেটাবেস-অপটিমাইজড কোয়েরি পরিচালনা করে।


Native SQL Queries ব্যবহার

১. @Query অ্যানোটেশন ব্যবহার করে

Spring Data JPA সরাসরি Native SQL কোয়েরি সাপোর্ট করে।

উদাহরণ

নীচে একটি Native SQL Query ব্যবহার করে টেবিল থেকে ডেটা রিটার্ন করার পদ্ধতি দেখানো হলো:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

    @Query(value = "SELECT * FROM users WHERE status = :status", nativeQuery = true)
    List<User> findUsersByStatus(String status);
}

ব্যাখ্যা

  • @Query: Native SQL কোয়েরি ব্যবহার করতে ব্যবহৃত হয়।
  • nativeQuery = true: নির্দেশ করে যে এটি একটি Native SQL কোয়েরি।
  • :status: প্যারামিটার বাউন্ডিং।

২. EntityManager ব্যবহার করে

EntityManager এর মাধ্যমে Native SQL কোয়েরি চালানো সম্ভব।

উদাহরণ

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class UserDao {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Object[]> findUsersWithNativeQuery(String status) {
        String sql = "SELECT id, name FROM users WHERE status = :status";
        Query query = entityManager.createNativeQuery(sql);
        query.setParameter("status", status);
        return query.getResultList();
    }
}

ব্যাখ্যা

  • EntityManager: Native SQL চালানোর জন্য ব্যবহৃত হয়।
  • createNativeQuery(): Native SQL কোয়েরি তৈরির জন্য ব্যবহৃত হয়।
  • setParameter(): প্যারামিটার বাউন্ডিং নিশ্চিত করে।

Hibernate Named Native Query

Hibernate এ Named Native Query সংজ্ঞায়িত করা সম্ভব।

উদাহরণ

import jakarta.persistence.*;

@Entity
@NamedNativeQuery(
    name = "User.findByStatus",
    query = "SELECT * FROM users WHERE status = ?1",
    resultClass = User.class
)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String status;

    // Getters and Setters
}

ব্যবহারের পদ্ধতি

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class UserDao {

    @PersistenceContext
    private EntityManager entityManager;

    public List<User> findByStatus(String status) {
        Query query = entityManager.createNamedQuery("User.findByStatus");
        query.setParameter(1, status);
        return query.getResultList();
    }
}

Native SQL এর সুবিধা ও অসুবিধা

সুবিধা

  • ডেটাবেস অপ্টিমাইজড কোয়েরি: নির্দিষ্ট ডেটাবেসে কার্যকর SQL ব্যবহার।
  • জটিল কোয়েরি: জটিল এবং কাস্টম ডেটা ফেচ করা সহজ।
  • পারফরম্যান্স: Native SQL কোয়েরি সরাসরি SQL হিসেবে চলে, যা কার্যকারিতা বাড়ায়।

অসুবিধা

  • ডেটাবেস নির্ভরতা: কোয়েরি নির্দিষ্ট ডেটাবেসে সীমাবদ্ধ।
  • পোর্টেবিলিটি কম: ORM টুলের সুবিধা হারায়।
  • কোড জটিলতা: কোড পড়া ও রক্ষণাবেক্ষণ কঠিন হতে পারে।

সারাংশ

স্প্রিং ওআরএম Hibernate এবং JPA ব্যবহার করে সাধারণ CRUD অপারেশন সহজ করে। তবে, Native SQL Queries ব্যবহার করলে ডেটাবেস-অপটিমাইজড এবং জটিল কোয়েরি কার্যকরভাবে করা যায়। এটি ব্যবহার করার আগে ডেটাবেস নির্ভরতা এবং রক্ষণাবেক্ষণের বিষয়টি বিবেচনা করা গুরুত্বপূর্ণ।

Content added By

Native SQL Query কি এবং এর প্রয়োগ

85
85

Native SQL Query কি?

Native SQL Query হলো ডাটাবেজে সরাসরি SQL স্টেটমেন্ট রান করার একটি পদ্ধতি। Hibernate বা Spring ORM সাধারণত HQL (Hibernate Query Language) বা Criteria API ব্যবহার করে ডাটাবেজের সাথে ইন্টারঅ্যাক্ট করে। তবে, কিছু বিশেষ ক্ষেত্রে যেখানে কাস্টম SQL স্টেটমেন্ট প্রয়োজন হয় (যেমন জটিল যোগ বা নির্দিষ্ট ডাটাবেস ফিচার ব্যবহার), সেখানে Native SQL Query ব্যবহার করা হয়।


Native SQL Query এর প্রয়োগ

Spring ORM এ Native SQL Query ব্যবহার করার জন্য @Query অ্যানোটেশন বা Hibernate এর createNativeQuery মেথড ব্যবহার করা হয়। নিচে এর বিভিন্ন প্রয়োগ দেখানো হলো।


উদাহরণ ১: Hibernate এর মাধ্যমে Native SQL Query

Hibernate এর Session অবজেক্ট ব্যবহার করে Native SQL Query রান করা যায়।

EmployeeDAO.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class EmployeeDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public List<Object[]> getEmployeesWithNativeQuery() {
        Session session = sessionFactory.getCurrentSession();
        String sql = "SELECT id, name, department FROM Employee";
        return session.createNativeQuery(sql).getResultList();
    }
}

উদাহরণ ২: Spring Data JPA এর মাধ্যমে Native SQL Query

Spring Data JPA ব্যবহার করে @Query অ্যানোটেশন দিয়ে Native SQL Query রান করা যায়।

EmployeeRepository.java

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query(value = "SELECT * FROM Employee WHERE department = :department", nativeQuery = true)
    List<Employee> findByDepartment(String department);
}

Native SQL Query এর ব্যবহার ধাপ

ধাপ ১: Hibernate এর কনফিগারেশন

Hibernate-এর জন্য hibernate.cfg.xml বা Spring এর applicationContext.xml ফাইলে কনফিগারেশন সঠিকভাবে সম্পন্ন করুন।

ধাপ ২: SQL স্টেটমেন্ট লিখুন

SQL স্টেটমেন্ট সরাসরি লিখুন এবং Hibernate বা Spring JPA থেকে রান করুন।

ধাপ ৩: প্রয়োজন অনুযায়ী প্যারামিটার ব্যবহার

Native Query-তে ডাইনামিক ডেটা পাস করার জন্য Named Parameters বা Indexed Parameters ব্যবহার করা যায়।


উদাহরণ ৩: Named Parameters সহ Native SQL Query

EmployeeRepository.java

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query(value = "SELECT * FROM Employee WHERE name = :name AND department = :department", nativeQuery = true)
    List<Employee> findByNameAndDepartment(@Param("name") String name, @Param("department") String department);
}

উদাহরণ ৪: Native Query এর মাধ্যমে Custom Projection

Native Query এর মাধ্যমে নির্দিষ্ট কলামগুলোর জন্য Projection ব্যবহার করা যায়।

Custom DTO তৈরি করুন

public class EmployeeDTO {
    private String name;
    private String department;

    public EmployeeDTO(String name, String department) {
        this.name = name;
        this.department = department;
    }

    // Getters and Setters
}

EmployeeRepository.java

import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query(value = "SELECT name, department FROM Employee", nativeQuery = true)
    List<Object[]> findAllEmployeeDetails();

    default List<EmployeeDTO> findAllAsDTO() {
        List<Object[]> results = findAllEmployeeDetails();
        return results.stream()
                      .map(row -> new EmployeeDTO((String) row[0], (String) row[1]))
                      .toList();
    }
}

Native SQL Query এর সুবিধা এবং সীমাবদ্ধতা

সুবিধা:

  • জটিল SQL স্টেটমেন্ট ব্যবহার করা যায়।
  • ডাটাবেস স্পেসিফিক অপারেশন সম্পন্ন করা যায়।
  • ORM এর সীমাবদ্ধতা অতিক্রম করে।

সীমাবদ্ধতা:

  • ডাটাবেসের উপর নির্ভরশীল।
  • কোড বেশি স্পষ্ট নয় এবং মেইনটেইন করা কঠিন।
  • পোর্টেবিলিটির অভাব (ডাটাবেস পরিবর্তনে কোড পরিবর্তন করতে হয়)।

Native SQL Query Spring ORM এবং Hibernate ব্যবহারকারীদের জন্য একটি গুরুত্বপূর্ণ টুল, যা ডাটাবেসের বিশেষ ফিচার বা জটিল কোয়েরি পরিচালনায় সহায়ক।

Content added By

@Query Annotation ব্যবহার করে Custom SQL Query তৈরি করা

65
65

Spring Data JPA-তে @Query অ্যানোটেশনটি ব্যবহার করে কাস্টম SQL বা HQL (Hibernate Query Language) কোয়েরি লেখা যায়। এটি এমন ক্ষেত্রে কার্যকর যখন ডিফল্ট মেথড বা কোয়েরিগুলো অ্যাপ্লিকেশনের চাহিদা পূরণ করতে পারে না।


@Query অ্যানোটেশনের বৈশিষ্ট্য

  • কাস্টম SQL/HQL কোয়েরি লেখা যায়।
  • নামযুক্ত প্যারামিটার (:parameterName) বা পজিশনাল প্যারামিটার (?index) ব্যবহার করা যায়।
  • Native Query চালানোর জন্য nativeQuery = true ব্যবহার করা হয়।
  • JPA রেপোজিটরির পদ্ধতিগুলোর সাথে কাস্টম কোয়েরি সংযুক্ত করা হয়।

Maven ডিপেনডেন্সি

Spring Data JPA ব্যবহার করতে নিম্নোক্ত ডিপেনডেন্সি যোগ করতে হবে:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

মডেল ক্লাস তৈরি করা

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "email")
    private String email;

    @Column(name = "age")
    private int age;

    // Getters and Setters
}

JPA রেপোজিটরি তৈরি করা

JPA রেপোজিটরি ইন্টারফেস তৈরি করে কাস্টম SQL কোয়েরি সংজ্ঞায়িত করা যাবে।

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    // Custom Query to find users by name
    @Query("SELECT u FROM User u WHERE u.name = :name")
    List<User> findUsersByName(@Param("name") String name);

    // Custom Query to find users above a certain age
    @Query("SELECT u FROM User u WHERE u.age > ?1")
    List<User> findUsersAboveAge(int age);

    // Native SQL Query to fetch users by email
    @Query(value = "SELECT * FROM users WHERE email = ?1", nativeQuery = true)
    User findUserByEmail(String email);
}

সার্ভিস লেয়ার তৈরি করা

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> getUsersByName(String name) {
        return userRepository.findUsersByName(name);
    }

    public List<User> getUsersAboveAge(int age) {
        return userRepository.findUsersAboveAge(age);
    }

    public User getUserByEmail(String email) {
        return userRepository.findUserByEmail(email);
    }
}

কন্ট্রোলার লেয়ার তৈরি করা

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/by-name/{name}")
    public List<User> getUsersByName(@PathVariable String name) {
        return userService.getUsersByName(name);
    }

    @GetMapping("/above-age/{age}")
    public List<User> getUsersAboveAge(@PathVariable int age) {
        return userService.getUsersAboveAge(age);
    }

    @GetMapping("/by-email")
    public User getUserByEmail(@RequestParam String email) {
        return userService.getUserByEmail(email);
    }
}

বৈশিষ্ট্য ও সুবিধা

  1. নির্দিষ্ট কোয়েরি বাস্তবায়ন: @Query এর মাধ্যমে ডাটাবেস অপারেশনে আরও নিয়ন্ত্রণ পাওয়া যায়।
  2. ডাইনামিক প্যারামিটার ব্যবহার: প্যারামিটারাইজড কাস্টম কোয়েরি ব্যবহার করে আরও স্থিতিস্থাপক কোড লেখা সম্ভব।
  3. Native Query সমর্থন: জটিল SQL স্টেটমেন্ট কার্যকর করার জন্য Native Query ব্যবহার করা যায়।

Spring ORM এ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি তৈরি ডাটাবেস অপারেশনকে আরও সুনিয়ন্ত্রিত এবং কার্যকর করতে সাহায্য করে।

Content added By

উদাহরণ সহ Native SQL Query পরিচালনা

89
89

Spring ORM এর মাধ্যমে Native SQL Query ব্যবহার করে সরাসরি ডেটাবেজের সাথে কাজ করা যায়। Hibernate এবং JPA উভয়ই Native SQL Query সাপোর্ট করে। যখন জটিল বা নির্দিষ্ট ডেটাবেজ অপারেশন প্রয়োজন হয়, তখন Native SQL Query ব্যবহার কার্যকর হতে পারে।

Spring ORM Hibernate ইন্টিগ্রেশন ব্যবহার করলে Hibernate এর createSQLQuery() এবং JPA এর @Query বা EntityManager.createNativeQuery() মেথডের মাধ্যমে Native SQL Query পরিচালনা করা যায়।


Native SQL Query ব্যবহারের কারণ

  • ডেটাবেজ-নির্ভর অপ্টিমাইজড কোয়েরি প্রয়োজন হলে।
  • জটিল বা কাস্টম কোয়েরি, যা ORM ফিচারে সহজে করা সম্ভব নয়।
  • পূর্বে বিদ্যমান SQL কোয়েরি পুনরায় ব্যবহার করতে হলে।

Hibernate এর মাধ্যমে Native SQL Query

উদাহরণ:

@Transactional
public List<Object[]> getEmployeesByDepartment(String department) {
    String sql = "SELECT e.id, e.name, e.salary FROM employee e WHERE e.department = :department";
    Query query = sessionFactory.getCurrentSession().createSQLQuery(sql);
    query.setParameter("department", department);
    return query.list();
}

বর্ণনা:

  • createSQLQuery() ব্যবহার করে Native SQL Query তৈরি করা হয়।
  • setParameter() দিয়ে প্যারামিটার সেট করা হয়।
  • list() মেথড ব্যবহার করে রেজাল্ট রিটার্ন করা হয়।

JPA এর মাধ্যমে Native SQL Query

উদাহরণ:

@Repository
public class EmployeeRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Object[]> getEmployeesByDepartment(String department) {
        String sql = "SELECT e.id, e.name, e.salary FROM employee e WHERE e.department = :department";
        Query query = entityManager.createNativeQuery(sql);
        query.setParameter("department", department);
        return query.getResultList();
    }
}

বর্ণনা:

  • createNativeQuery() মেথড ব্যবহার করা হয়।
  • setParameter() দিয়ে SQL প্যারামিটার সেট করা হয়।
  • getResultList() মেথড রেজাল্ট লিস্ট আকারে প্রদান করে।

@Query ব্যবহার করে Native SQL Query

JPA এর ক্ষেত্রে @Query অ্যানোটেশন ব্যবহার করে Native SQL Query লেখা যায়।

উদাহরণ:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query(value = "SELECT * FROM employee e WHERE e.department = :department", nativeQuery = true)
    List<Employee> findByDepartment(@Param("department") String department);
}

বর্ণনা:

  • @Query এর মাধ্যমে SQL কোয়েরি সরাসরি লেখা হয়।
  • nativeQuery = true নির্দেশ করে এটি একটি Native Query।
  • @Param ব্যবহার করে প্যারামিটার পাস করা হয়।

উদাহরণ: Native SQL Query প্রয়োগ

সার্ভিস ক্লাস উদাহরণ:

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public List<Employee> getEmployeesByDepartment(String department) {
        return employeeRepository.findByDepartment(department);
    }
}

কন্ট্রোলার ক্লাস উদাহরণ:

@RestController
@RequestMapping("/employees")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/department/{department}")
    public List<Employee> getEmployeesByDepartment(@PathVariable String department) {
        return employeeService.getEmployeesByDepartment(department);
    }
}

Spring ORM ব্যবহার করে Native SQL Query ডেটাবেজ অপারেশনে নমনীয়তা প্রদান করে। এর মাধ্যমে জটিল কোয়েরি সহজে বাস্তবায়ন করা যায় এবং Spring এর ট্রানজেকশন ব্যবস্থাপনার সুবিধাও উপভোগ করা যায়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion